#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "GUI_CMD.h"

GUI_Struct Trans_GUI_to_Struct(uint8_t * buf)
{
    GUI_Struct GUI_Stu;
    GUI_Stu.Flag=false;
    uint8_t i=0;
    uint8_t CHK_Num=0;
    
    uint16_t Data_Len=0;
    uint16_t Check_Sum=0;
    
    GUI_Stu.START[0]=buf[0];
    GUI_Stu.START[1]=buf[1];

    if(GUI_Stu.START[0]!=GUI_START0 || GUI_Stu.START[1]!=GUI_START1)
    {
        return GUI_Stu;
    }

    GUI_Stu.BCNT[0]=buf[2];
    GUI_Stu.BCNT[1]=buf[3];

    Data_Len=(GUI_Stu.BCNT[0]<<8)|(GUI_Stu.BCNT[1]);

    if(!Data_Len)
    {
        return GUI_Stu;
    }

    CHK_Num=Data_Len+6;
    GUI_Stu.STOP[0]=buf[CHK_Num+2];
    GUI_Stu.STOP[1]=buf[CHK_Num+3];

    if(GUI_Stu.STOP[0]!=GUI_STOP0 || GUI_Stu.STOP[1]!=GUI_STOP1)
    {
        return GUI_Stu;
    }

    GUI_Stu.CHK[0]=buf[CHK_Num];
    GUI_Stu.CHK[1]=buf[CHK_Num+1];

    for(i=0;i<CHK_Num;i++)
    {
        Check_Sum=Check_Sum+buf[i];
    }
    
    if((Check_Sum>>8)!=GUI_Stu.CHK[0] || (Check_Sum&0x00FF)!=GUI_Stu.CHK[1])
    {
        return GUI_Stu;
    }

    GUI_Stu.ADDR[0]=buf[4];
    GUI_Stu.ADDR[1]=buf[5];
    
    GUI_Stu.COM=buf[6];

		memcpy(GUI_Stu.DATA,&buf[7],Data_Len-1);

    GUI_Stu.Flag=true;
    return GUI_Stu;
}

uint8_t Trans_GUI_to_Buf(GUI_Struct GUI_Stu,uint8_t * buf)
{
    uint8_t i=0;
    uint8_t CHK_Num=0;
    
    uint16_t Data_Len=0;
    uint16_t Check_Sum=0;

    if(GUI_Stu.START[0]!=GUI_START0 || GUI_Stu.START[1]!=GUI_START1)
    {
        return 0;
    }

    if(GUI_Stu.STOP[0]!=GUI_STOP0 || GUI_Stu.STOP[1]!=GUI_STOP1)
    {
        return 0;
    }

    buf[0]=GUI_Stu.START[0];
    buf[1]=GUI_Stu.START[1];

    buf[2]=GUI_Stu.BCNT[0];
    buf[3]=GUI_Stu.BCNT[1];

    buf[4]=GUI_Stu.ADDR[0];
    buf[5]=GUI_Stu.ADDR[1];

    Data_Len=(GUI_Stu.BCNT[0]<<8)|(GUI_Stu.BCNT[1]);

    if(!Data_Len)
    {
        return 0;
    }

    CHK_Num=Data_Len+6;

    buf[6]=GUI_Stu.COM;

		memcpy(&buf[7],&GUI_Stu.DATA[0],Data_Len-1);

    for(i=0;i<CHK_Num;i++)
    {
        Check_Sum=Check_Sum+buf[i];
    }
    
    buf[CHK_Num]=(Check_Sum&0xFF00)>>8;
    buf[CHK_Num+1]=Check_Sum&0x00FF;

    buf[CHK_Num+2]=GUI_Stu.STOP[0];
    buf[CHK_Num+3]=GUI_Stu.STOP[1];

    return (CHK_Num+4);  //这里返回的是调制后数组的长度
}

uint8_t GUI_Slave_Send(GUI_Struct GUI_Stu)
{
	GUI_Struct Stu={GUI_START0,GUI_START1,0x00,0x00,GUI_ADDR0,GUI_ADDR1};
	uint8_t buf[21];
	memset(buf,0,sizeof(buf)/sizeof(buf[0]));
	uint16_t len=0;

	Stu.BCNT[0]=GUI_Stu.BCNT[0];
	Stu.BCNT[1]=GUI_Stu.BCNT[1];
	
	Stu.COM=GUI_Stu.COM;
	
	Stu.STOP[0]=GUI_STOP0;
	Stu.STOP[1]=GUI_STOP1;
	
	len=(Stu.BCNT[0]<<8)|Stu.BCNT[1];
	
	memcpy(Stu.DATA,GUI_Stu.DATA,len-1);
	
	len=Trans_GUI_to_Buf(Stu,buf);
	//UART_Write_Blocking(LCD_UART_Handle,buf,len);	 这里填串口发送函数
	
	return 1;
}
